#include <iostream>
#include <cstring>

// 定义 MAC 地址长度
#define MAC_ADDRESS_LENGTH 6

// 定义 MAC 地址类型
typedef unsigned char MAC_address[MAC_ADDRESS_LENGTH];

// 定义以太网帧结构体
struct EthernetFrame {
    MAC_address destination; // 目标地址
    MAC_address source;      // 源地址
    unsigned short type;     // 类型字段
    unsigned char data[1500]; // 数据字段
};

// 本机地址
MAC_address this_mac_address = {0x00, 0x14, 0x22, 0x01, 0x23, 0x45}; // 示例本机地址

// 判断目标 MAC 地址是否与本机匹配
int mac_address_match(const EthernetFrame* frame) {
    // 判断是否是广播地址 (广播地址是所有位为 1，即 FF:FF:FF:FF:FF:FF)
    for (int i = 0; i < MAC_ADDRESS_LENGTH; ++i) {
        if (frame->destination[i] != 0xFF) {
            break;
        }
        if ( i == MAC_ADDRESS_LENGTH - 1) {
            return 1; // 广播地址匹配
        }
    }

    // 判断是否是多播地址 (多播地址的第一个字节最低位为 1)
    if (frame->destination[0] & 0x01) {
        return 1; // 多播地址匹配
    }

    // 判断是否是本机地址
    if (memcmp(frame->destination, this_mac_address, MAC_ADDRESS_LENGTH) == 0) {
        return 1; // 本机地址匹配
    }

    // 如果以上情况都不匹配，则返回 0
    return 0;
}

int main() {
    // 示例以太网帧
    EthernetFrame frame = {
        {0x00, 0x14, 0x22, 0x01, 0x23, 0x45}, // 目标地址
        {0x00, 0x14, 0x22, 0x01, 0x23, 0x46}, // 源地址
        0x0800, // 类型字段
        {0}      // 数据字段
    };

    int match = mac_address_match(&frame);
    if (match) {
        std::cout << "帧匹配本机地址、多播地址或广播地址！" << std::endl;
    } else {
        std::cout << "帧不匹配本机地址、多播地址或广播地址。" << std::endl;
    }

    return 0;
}
